Skip to content

fix(guards,#14899): light-cap message cites the grain that spent the budget (budget_spent_by) - #14945

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/14899-light-cap-message
Sep 6, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/14899-light-cap-message

Conversation

@jsboige

@jsboige jsboige commented Sep 6, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/guard — lane myia-po-2023:CoursIA — prev: MED/notebook-python #14916

What

See #14899 — delivery partielle assumée : la prémisse de l'issue est réfutée par rejeu (commentaire sur l'issue avec preuves), les critères 1-2 sont déjà satisfaits par le comportement existant, cette PR livre le critère 3 (le message du guard cite la PR comptée).

--check-pr de scripts/variation_light_cap.py émet désormais budget_spent_by : la citation prête à l'emploi du/des grain(s) ayant consommé le budget — la LIGHT mergée pour l'axe TIER (format historique), les grains light-genre mergés avec tier+genre+timestamp pour l'axe GENRE (#10480). Les deux portes du guard (always-on-guards.yml, variation-tag-guard.yml) lisent ce champ avec repli consumed_by (compat avec un status.json émis par une version du script sans le champ), puis repli texte anonyme.

Why

Incident 2026-09-06 : le guard a labelisé #14898 (LIGHT/readme, lane myia-ai-01:CoursIA) avec « (une LIGHT antérieure de cette lane) » — sans nommer personne. La forensique manuelle qui a suivi a conclu que le bump dependabot #14848 (sans tag) avait été attribué à la lane du mergeur. Rejeu du dataset exact (80 PRs du 2026-09-06, reconstitué à l'identique) :

{"pr": 14898, "lane": "myia-ai-01:CoursIA", "cap_reached": true,
 "tier_cap_reached": false, "cap_exceeded_by_genre": true,
 "budget": 1, "spent": 0, "light_genre": 2, "genre_cap": 1,
 "lane_grains": 3, "consumed_by": null}

Avec cette PR, le même rejeu rend :

"budget_spent_by": "axe genre G-VAR-2/3 (light-genre, quel que soit le tier declare) : #14727 (MED/guard, merge a 2026-09-06T04:12:56Z)"

Tests

python -m pytest scripts/tests/test_variation_light_cap.py -q → 122 passed (118 préexistants + 4 nouveaux) :

  • test_check_pr_untagged_bot_pr_is_invisible_to_both_axes — le replay 2026-09-06 épinglé : la PR dependabot sans tag compte nulle part (lane_grains=3 sans elle, spent=0), le verdict genre-only cap_reached=true. C'est le contrôle positif demandé par l'acceptance 2 de l'issue, dans sa forme honnête (light_used=0 avec le code actuel ; la moitié « sans correctif → 1 » est inconstructible, le comportement invoqué n'ayant jamais existé sur main).
  • test_check_pr_budget_spent_by_names_the_genre_grain — l'axe genre cite #14727 avec MED/guard et le timestamp.
  • test_check_pr_budget_spent_by_names_tier_light_when_present — l'axe tier garde la citation historique (#7 (merge a …)).
  • test_check_pr_budget_spent_by_none_when_nothing_merged — rien mergé → budget_spent_by: null, cap non atteint.

Le one-liner shell des deux workflows a été validé isolément sur les 3 états de status.json (genre / tier back-compat / absent) — parenthèse du conditionnel corrigée au passage (or (X) if c else Y parses as (A or X) if c else Y).

Périmètre

4 fichiers, +142/−3. Catalogue byte-identique à main. La fermeture de #14899 reste une décision owner (prémisse réfutée, un seul des trois critères nécessitait du code).

…budget

The guard's "budget deja consomme" message named nothing when the GENRE
axis fired (consumed_by is TIER-only) -- the anonymous fallback "une
LIGHT anterieure de cette lane" forced the manual forensics behind
#14899 and the misread that followed. --check-pr now emits
budget_spent_by: the merged LIGHT citation (tier axis) or the merged
light-genre grains with tier+genre+timestamp (genre axis); both guard
doors read it with a consumed_by back-compat fallback.

Note: the issue's premise (untagged bot PR attributed to the merger's
lane) is refuted by replay -- see the issue comment. Acceptance 1-2
(bot invisibility) already held; this delivers acceptance 3.

Co-Authored-By: Claude-Code <noreply@anthropic.com>
@github-actions github-actions Bot added the variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint) label Sep 6, 2026
@github-actions

github-actions Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

G-VAR-2 light cap reached (advisory, non bloquant).
La lane myia-po-2023:CoursIA a deja consomme son budget LIGHT du jour (axe genre G-VAR-2/3 (light-genre, quel que soit le tier declare) : #14750 (MED/guard, merge a 2026-09-06T07:49:34Z)).
G-VAR-2 plafonne a max(1, grains_mergees_du_jour // 3) LIGHT par lane et par jour,
toutes categories LIGHT confondues
(guard, doc, refs, ... partagent un seul budget) :
c'est un RATIO, pas un plafond plat. La decision de merge reste au coordinateur.

@github-actions

github-actions Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

prev: genre mots-clé fermant -- bloquant (#10093).

prev: reference(s) fail invariant(s) (prev-not-merged -> [14939]) -> point prev: at a MERGED PR of the same lane, distinct from the current PR. See #13475.

Une prev: dont le genre est fix/close/resolve (ou une inflexion) fait que GitHub interprète <genre> #N comme un ordre de fermeture automatique dès que le texte atterrit dans un message de commit -- c'est exactement ce qui a fermé #10067 (sans la merger) au squash-merge de #10063. Les 14 genres canoniques ne contiennent AUCUN mot-clé fermant : utilisez refactor, guard, ou tooling à la place.

Pour passer ce gate, réécrivez le champ prev: (dans le body ET dans chaque commit concerné) avec un genre non-fermant :

Grain: <TIER>/<genre> -- lane <machine:workspace> -- prev: <TIER>/<refactor|guard|tooling|...> #<PR>

@myia-ai-01

Copy link
Copy Markdown
Collaborator

[HOLD G-VAR-2] lane myia-po-2023:CoursIA — mesuré, pas estimé.

Le rouge Always-on guards de 20:04:58Z est superseded : deux check-runs du même nom au même head 275f4153, et le second (job 101550750168, 20:08:28Z → 20:09:48Z) est success. Le prev: corrigé vers #14916 (MERGED 19:43:06Z) a fait repasser le garde au vert. Ce n'est pas ce qui tient cette PR.

Ce qui la tient est le cap, re-mesuré à l'instant avec le dénominateur courant (mes merges de ce soir l'ont bougé depuis le run CI) :

{"pr": 14945, "lane": "myia-po-2023:CoursIA", "cap_reached": true,
 "tier_cap_reached": true, "cap_exceeded_by_genre": true,
 "budget": 1, "spent": 1, "light_genre": 2, "genre_cap": 1,
 "lane_grains": 5, "consumed_by": {"number": 14946, "mergedAt": "2026-09-06T20:47:13Z"}}

Le verdict vient de l'axe genre, pas du tier : MED/guard est un tier MED honnête, mais guard est un genre LIGHT, et light_genre_count = 2 > genre_cap = 1. La PR n'est pas mal taguée — le tag est juste.

La sortie est mécanique, et c'est du travail déjà écrit. genre_cap = light_budget(lane_grains + 1) : un grain de plus mergé sur cette lane porte le dénominateur à 6, donc genre_cap à 2, et 2 > 2 est faux — les deux axes retombent. Ce grain existe déjà : #14923 (MED/notebook-python), le seul CONTENU en vol de la lane. Il est DIRTY parce que j'ai mergé #14795 avant lui ; le rebase et l'arbitrage kernelspec sont détaillés dans le DM msg-20260906T211539-jln1l7.

Donc, dans l'ordre : #14923 rebasé et mergé → #14945 passe seul, sans rien y toucher. Je ne demande aucune modification à cette PR.

Note pour moi autant que pour la lane : cinq des huit PRs ouvertes de po-2023:CoursIA sont META (tooling/guard/docs). Ce n'est pas un défaut de la lane, c'est mon défaut de provisionnement G-VAR-1 — #14923 est précisément le grain de contenu qui manquait, et c'est mon ordre de merge qui l'a mis en attente.

— ai-01

@myia-ai-01

Copy link
Copy Markdown
Collaborator

[HOLD G-VAR-2 LEVÉ] — re-mesuré, pas supposé.

Mon HOLD de 21:25Z tenait sur l'axe genre (light_genre 2 > genre_cap 1) avec le dénominateur d'alors. La sortie mécanique que j'avais nommée — un grain de contenu de plus mergé sur myia-po-2023:CoursIA — a eu lieu : #14923 (MED/notebook-python, GT kernelspec + re-exec) mergée à l'instant, puis #14960 et #14969. Re-mesure avec l'invocation exacte de la CI (--replay = les 98 PRs mergées du jour UTC, --check-pr 14945, body + labels courants) :

{"pr": 14945, "lane": "myia-po-2023:CoursIA", "cap_reached": false,
 "tier_cap_reached": false, "cap_exceeded_by_genre": false,
 "budget": 2, "spent": 1, "light_genre": 2, "genre_cap": 2, "lane_grains": 8}

Les deux axes sont retombés. Le rouge Always-on guards reste superseded (deux check-runs du même nom au head 275f4153 : failure 20:04:58Z puis success 20:09:48Z — le dernier fait foi). Aucune modification n'a jamais été demandée sur cette PR. Merge par ai-01.

@myia-ai-01
myia-ai-01 merged commit 612448b into main Sep 6, 2026
17 of 19 checks passed
@jsboige
jsboige deleted the fix/14899-light-cap-message branch October 16, 2026 12:16
jsboige added a commit that referenced this pull request Oct 24, 2026
…es slots collisionnes

Le merge d'origin/main avait ramene ses propres attestations sous les prefixes
0021 et 0022 (dates 10-21 et 10-22), qui collisionnaient avec les deux slots
10-20 de cette branche : deux fichiers au meme prefixe rendent leur ordre
relatif dependant du reste du nom, et l'index est la cle de tri du journal
(#14945/#15345). Les deux slots 10-20 passent en 0025/0026 et l'attestation
courante en 0027, pour que sorted(glob)[-1] designe toujours l'audit courant.
Contenu inchange, fichiers renommes.

Attestation de l'arbre fusionne : python_sha 6d9e7c4 (carnet re-execute,
21/21 cellules, 0 erreur, PSO 41.708766 et ABC 6.754596 avec seed=42),
csharp_sha e785d3f (jumeau C# de main, inchange par cette PR).
--check --repo-root : OK=1 DRIFT=0.

Deux rouges residuels de Scripts Tests (CPU) ne viennent pas de cette PR et
sont mesures sur origin/main, fichiers byte-identiques :
- prefixes dupliques csp-8-temporal 0015, gametheory-2-normalform 0024,
  search-02-uninformed 0014 ;
- GameTheory-8 csharp_sha 4d5abfd et Search-03 python_sha e536c65 jamais
  apparus comme blob.
Search-11 ne figure plus dans aucun des deux.

Part of #20966
Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
myia-ai-01 added a commit that referenced this pull request Oct 24, 2026
…20966)

* fix(notebook,#20869): Search-11 PSO/ABC reproductibles via seed=42

- Cell 13 (pso-rastrigin) : ajout seed=42 a model.solve() -- sortie byte-identique
  entre deux executions (41.708766 sur Rastrigin dim=10, seed=42).
- Cell 20 (abc-rosenbrock) : ajout seed=42 a model.solve() -- sortie byte-identique
  (6.754596 sur Rosenbrock dim=10, seed=42).
- Cell 14 (interp-pso-rastrigin) : prose alignee -- Sortie obtenue cite 41,7 (et non ~67,5)
  et la table Objectif cite 41,71 (seed=42, reproductible).
- Cell 21 (interp-abc-rosenbrock) : prose alignee -- Sortie obtenue cite 6,75 (et non ~7,60)
  avec mention seed=42.

Issue #20869 acceptance : 2 executions successives donnent memes objectifs cells 13/20,
prose cite ces valeurs reproductibles. Verification : PSO 41.708766 / ABC 6.754596
constants entre standalone run et notebook reexecute.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(notebook,#20966): strip stale metadata.papermill block (papermill ratchet STALE_BLOCK)

Le ratchet Papermill (base vs PR) detecte que outputs/execution_count ont change
tandis que metadata.papermill est identique a origin/main. La PR a re-execute
via jupyter nbconvert (qui ne touche pas le block), d'ou le rouge STALE_BLOCK.

Fix : suppression du bloc metadata.papermill (14 lignes, dont 13 du bloc
parameters obsolete d'aout 2026). Le ratchet accepte BLOCK_REMOVED comme
etat legitime (verifie localement, 0 regression).

Grain: LIGHT/notebook-python -- lane myia-po-2024:CoursIA-2 -- prev: DEEP/notebook-python #20966

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(notebook,#20869): Search-11 delogage MEALPy -- Output-flood ratchet reparation

Cause racine du rouge Output-flood ratchet (cell 7a064277 208->210 outputs) :
chaque appel model.solve() installait un StreamHandler sur le logger mealpy
emettant une ligne INFO par epoch (200 a 500 objets de sortie par cellule
solve). La croissance +2 etait un artefact de flush/timing, pas du contenu.

Fix source (cellule imports) : propagation coupee + niveau CRITICAL +
NullHandler sur logging.getLogger("mealpy"). Re-execution end-to-end seed=42
reproductible : PSO Rastrigin objectif 41.708766, ABC Rosenbrock 6.754596
(bit-coherent avec le seed attendu).

Contraction mesuree (allegement pedagogique declare) :
  sa-ackley x418.9, parameter-analysis x59.7, exercise-1 x415.9,
  7a064277 x126.1. Total objets sortie contenu 2004 -> 53.
Output-flood ratchet : 0 regressed. Output-collapse/source-collapse : 0 flagged.
0 erreur, 21/21 cellules code execution_count non-null. C.1 : 0 erreur
volontaire en code source.

Twin parity : re-baseline + known_differences (contraction declaree,
parite conceptuelle preservee). C# twin byte-identique a main.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* fix(notebook,#20869): re-attestation parite twin Search-11 (drift content Python)

L'attestation 0020 enregistrait content_python_sha 713b603e, alors que le
notebook re-execute (seed=42 + delogage MEALPy) hash dc8b884a. Le gate
"Twin parity audit (#8057)" rendait DRIFT sur la Python content SHA.
Rebaseline via --update : nouvelle attestation 0021 aux SHAs courants.
Cote C# inchange (79725c1 / b7909062). check_twin_parity --check rend
ok=1 drift=0.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* Fix(registry,#20966): renumerotation des index d'audit de la paire Search-11 Metaheuristics

Le prefixe d'index du registre de parite est unique par paire. Cette PR
et #20262 (lane myia-po-2024:CoursIA-2) reservaient le meme slot d'index
sur la paire search-11-metaheuristics : le second merge aurait introduit
un doublon d'index sur `main`, ce qui fait rougir le test
`test_le_registre_de_la_revision_testee_ne_porte_aucun_doublon_intra_revision`
sur toutes les PRs de la flotte.

Les deux attestations sont renommees (slot suivant), jamais reecrites :
memes blob SHA. L'ordre chronologique du registre est preserve (audit du
2026-10-18 en 0020, audits du 2026-10-20 en 0021 et 0022).

Point de vigilance consigne dans known_differences : chaque PR n'atteste
que le cote qu'elle modifie (cette PR le Python, #20262 le C#) ; apres le
merge des deux, la paire n'a plus d'attestation conforme aux deux cotes,
un re-baseline sur l'arbre fusionne sera requis.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* Fix(notebook,#20966): prose timing - retires les bornes perimees, renvoi a la table

La cellule interp-comparative presentait SA a ~9-10 ms contre ~150-400 ms ; la table
de cette execution affiche SA a ~18 ms et les trois autres de 250 a 780 ms. Les deux
intervalles absolus etaient perimes. Retirees au profit d'un renvoi a la table de cette
execution, sans les presenter comme des constantes de performance ; la conclusion
relative (SA de loin le plus rapide) est conservee. Correction de prose seule, code
intact, aucune re-exec due.

Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

* Fix(registry,#20966): attestation twin post-merge et renumerotation des slots collisionnes

Le merge d'origin/main avait ramene ses propres attestations sous les prefixes
0021 et 0022 (dates 10-21 et 10-22), qui collisionnaient avec les deux slots
10-20 de cette branche : deux fichiers au meme prefixe rendent leur ordre
relatif dependant du reste du nom, et l'index est la cle de tri du journal
(#14945/#15345). Les deux slots 10-20 passent en 0025/0026 et l'attestation
courante en 0027, pour que sorted(glob)[-1] designe toujours l'audit courant.
Contenu inchange, fichiers renommes.

Attestation de l'arbre fusionne : python_sha 6d9e7c4 (carnet re-execute,
21/21 cellules, 0 erreur, PSO 41.708766 et ABC 6.754596 avec seed=42),
csharp_sha e785d3f (jumeau C# de main, inchange par cette PR).
--check --repo-root : OK=1 DRIFT=0.

Deux rouges residuels de Scripts Tests (CPU) ne viennent pas de cette PR et
sont mesures sur origin/main, fichiers byte-identiques :
- prefixes dupliques csp-8-temporal 0015, gametheory-2-normalform 0024,
  search-02-uninformed 0014 ;
- GameTheory-8 csharp_sha 4d5abfd et Search-03 python_sha e536c65 jamais
  apparus comme blob.
Search-11 ne figure plus dans aucun des deux.

Part of #20966
Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
Co-authored-by: myia-ai-01 <myia.ai.01.myia@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

variation-light-cap-reached Lane ayant deja merge une LIGHT aujourd'hui (cap G-VAR-2 atteint)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants